home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Magazin: Amiga-CD 1996 March
/
Amiga-CD 1996 #3.iso
/
demos
/
stormc-demo
/
examples
/
fplot
/
plot.cc
< prev
next >
Wrap
C/C++ Source or Header
|
1996-01-19
|
2KB
|
111 lines
/*
Funktionsplotter in Storm C
*/
#include <exec/types.h>
#include <intuition/intuition.h>
#include <functions.h>
#include <stream.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
#include "fclass.h"
// ******** Zeichenroutine ********
// Windowdimensionen:
#define WW 640
#define WH 190
#pragma break -
void plot(Func *f, double minx, double maxx, double miny, double maxy)
{
NewWindow mynewwin =
{ 0, 0, WW, WH+10, 2, 1, CLOSEWINDOW,
ACTIVATE | WINDOWSIZING | WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE | GIMMEZEROZERO,
NULL, NULL, " Plot ++ ", NULL, NULL, 100, 50, 640, 200, WBENCHSCREEN};
struct Window* mywin = OpenWindow(&mynewwin);
if (!mywin) exit(1);
RastPort *RP = mywin->RPort;
double XS = WW / (maxx-minx), YS = WH / (maxy-miny);
int X0 = int(-XS*minx), Y0 = int(-YS*miny);
SetAPen(mywin->RPort, 3);
if (miny < 0 && maxy > 0)
{ // y-Achse zeichnen:
Move(RP, 0, WH-Y0);
Draw(RP, WW, WH-Y0);
}
if (minx < 0 && maxx > 0)
{ // x-Achse zeichnen:
Move(RP, X0, 0);
Draw(RP, X0, WH);
}
SetAPen(mywin->RPort, 0);
Move(mywin->RPort, 0, 0);
for (int i=0; i<WW; i++)
{ double x = minx+i/XS, y = f->eval(x);
int yp = int(YS*y+Y0);
if (yp > -WH && yp < 2*WH) Draw(RP, i, WH-yp);
SetAPen(RP, 1);
}
WaitPort(mywin->UserPort);
CloseWindow(mywin);
}
#pragma break +
void main()
{
char input[100], buf[200];
cout << "\nPlot ++\nGeschrieben von Jochen Becher Storm C\n\n";
cout << "Funktion: f(x) = "; cin.getline(input, 100);
Func *MyExp = Parse(input);
if (MyExp)
{ double minX, maxX, minY, maxY;
for(;;)
{ cout << "X-Bereich: von "; cin >> minX;
cout << " bis "; cin >> maxX;
if (minX < maxX) break;
cout << "Das Minimum muß kleiner als das Maximum sein.\n";
}
for(;;)
{ cout << "Y-Bereich: von "; cin >> minY;
cout << " bis "; cin >> maxY;
if (minY < maxY) break;
cout << "Das Minimum muß kleiner als das Maximum sein.\n";
}
cout << "\nFunktion: "; MyExp->print(buf); cout << "\n";
plot(MyExp, minX, maxX, minY, maxY);
delete MyExp;
}
else
cout << "Versuch's doch gleich noch mal!\n";
}